# Создание календаря с датами

```
LET varCalendar_Start_Date = NUM(MAKEDATE(2022,5,1));
LET varCalendar_End_Date = NUM(MAKEDATE(2022,5,5));

_tmp_newdates:
LOAD
    DATE($(varCalendar_Start_Date) + RowNo() - 1) as _DateStart
AUTOGENERATE $(varCalendar_End_Date) - $(varCalendar_Start_Date) + 1;
```
Результатам выполнения будет поле **_DateStart** со значениями:
```
01.05.2022
02.05.2022
03.05.2022
04.05.2022
05.05.2022
```

# Создание календаря с месяцами

```
LET varCalendar_Start_Date = NUM(MAKEDATE(2022,1,1));
LET varCalendar_End_Date = NUM(MAKEDATE(2022,5,5));

_tmp_newdates:
LOAD DISTINCT
    DATE(MONTHSTART($(varCalendar_Start_Date) + RowNo() - 1),'YYYY_MM') as _MonthStart
AUTOGENERATE $(varCalendar_End_Date) - $(varCalendar_Start_Date) + 1;
```
Результатам выполнения будет поле **_MonthStart** со значениями:
```
2022_01
2022_02
2022_03
2022_04
2022_05
```



# Функция для создания календаря с периодами

## Принимаемые параметры

- _varTablename - название таблицы, в которую будут помещены значения. По-умолчанию *ls_GenericCalendar_Table*
- _varPeriodStart - начало периода, передавать в виде чисел
- _varPeriodEnd - конец периода, передавать в виде чисел
- _varExportFieldName - название поля, в которое будут помещены значения, по-умолчанию - *_GenericPeriodValue*
- _varFormat - формат выводимых данных используемый для функции [DATE()](https://help.qlik.com/ru-RU/sense/May2022/csh/client/scriptsyntax.Date), по-умолчанию - пусто
- _varGranularity принимаемые значения [day, month, year]. По-умолчанию *day*

## Вызов функции

- CALL ls_GenericCalendar('' , num(makedate(2020)) , num(makedate(2022)-1) , '' , 'YYYY_MM' , 'month');

создает таблицу "ls_GenericCalendar_Table", с полем "_GenericPeriodValue", в котором содержатся значения:
```
2020_01
2020_02
2020_03
2020_04
2020_05
2020_06
2020_07
2020_08
2020_09
2020_10
2020_11
2020_12
2021_01
2021_02
2021_03
2021_04
2021_05
2021_06
2021_07
2021_08
2021_09
2021_10
2021_11
2021_12
```

- CALL ls_GenericCalendar('table' , num(makedate(2020)) , num(makedate(2022)-1) , '_years' , 'YYYY' , 'year');

создает таблицу "table", с полем "_years", в котором содержатся значения:
```
2020
2021
```

- CALL ls_GenericCalendar('_periodtable' , num(makedate(2020)) , num(makedate(2020,2)) , '_datestoload' , 'YYYY_MM_DD' , '');

создает таблицу "_periodtable", с полем "_datestoload", в котором содержатся значения:
```
2020_01_01
2020_01_02
2020_01_03
2020_01_04
2020_01_05
2020_01_06
2020_01_07
2020_01_08
2020_01_09
2020_01_10
2020_01_11
2020_01_12
2020_01_13
2020_01_14
2020_01_15
2020_01_16
2020_01_17
2020_01_18
2020_01_19
2020_01_20
2020_01_21
2020_01_22
2020_01_23
2020_01_24
2020_01_25
2020_01_26
2020_01_27
2020_01_28
2020_01_29
2020_01_30
2020_01_31
2020_02_01

```

## Код функции

```
SUB ls_GenericCalendar(ls_varTablename, ls_varPeriodStart, ls_varPeriodEnd, ls_varExportFieldName, ls_varFormat, ls_varGranularity)


// ls_varTablename - название таблицы, в которую будут помещены значения. По-умолчанию ls_GenericCalendar_Table
// ls_varPeriodStart - Начало периода, передавать в виде чисел
// ls_varPeriodEnd - Конец периода, передавать в виде чисел
// ls_varExportFieldName - название поля, в которое будут помещены значения, по-умолчанию - _GenericPeriodValue
// ls_varFormat - формат выводимых данных используемый для функции DATE(), по-умолчанию - пусто
// ls_varGranularity принимаемые значения [day, month, year]. По-умолчанию day

IF LEN('$(ls_varTablename)') = 0 THEN; LET ls_varTablename = 'ls_GenericCalendar_Table'; END IF;
IF LEN('$(ls_varExportFieldName)') = 0 THEN; LET ls_varExportFieldName = '_GenericPeriodValue'; END IF;
IF LEN('$(ls_varFormat)') = 0 THEN
    LET ls_varFormat = '';
ELSE
    LET ls_varFormat = ', ' & chr(39) & '$(ls_varFormat)' & chr(39);
END IF;
IF LEN('$(ls_varGranularity)') = 0 THEN; LET ls_varGranularity = 'day'; END IF;
IF '$(ls_varGranularity)' = 'day' THEN
    SET ls_varGranularity = 'DAYSTART';
ELSEIF '$(ls_varGranularity)' = 'month' THEN
    SET ls_varGranularity = 'MONTHSTART';
ELSEIF '$(ls_varGranularity)' = 'year' THEN
    SET ls_varGranularity = 'YEARSTART';
END IF;

[$(ls_varTablename)]:
LOAD DISTINCT
    DATE($(ls_varGranularity)($(ls_varPeriodStart) + RowNo() - 1)$(ls_varFormat)) as [$(ls_varExportFieldName)]
AUTOGENERATE $(ls_varPeriodEnd) - $(ls_varPeriodStart) + 1;

SET ls_varTablename = ;
SET ls_varPeriodStart = ;
SET ls_varPeriodEnd = ;
SET ls_varExportFieldName = ;
SET ls_varFormat = ;
SET ls_varGranularity = ;

END SUB;
```
